package magchess10.rn.controle;

import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import magchess10.rn.jogador.Jogador;
import magchess10.rn.utils.TabuleiroUtils;

public class DescritorMesaCliente {

	private final Map<String, Jogador> mapaJogadores = new LinkedHashMap<String, Jogador>();
	private final Map<String, PosicionamentoMesa> posicionamentoMesas = new HashMap<String, PosicionamentoMesa>();
	
	public DescritorMesaCliente(String[] jogadoresMesa, int tempoInicial) {
		for (int indiceJogador = 0; indiceJogador < 4; indiceJogador++) {
			mapaJogadores.put(jogadoresMesa[indiceJogador], createJogador(
					jogadoresMesa[indiceJogador], tempoInicial, indiceJogador));
			posicionamentoMesas.put(jogadoresMesa[indiceJogador],
					new PosicionamentoMesa(jogadoresMesa,
							jogadoresMesa[indiceJogador]));
		}
	}

	private Jogador createJogador(String Nomejogador, int tempoInicial,
			int indiceJogador) {
		return new Jogador(Nomejogador, determinaCor(indiceJogador),
				tempoInicial * 60, indiceJogador);
	}
	
	public Collection <Jogador> getJogadores (){
		return mapaJogadores.values();
	}
	
	
	
	public Map<String, Jogador> getMapaJogadores() {
		return mapaJogadores;
	}

	public Jogador getJogadorByName (String nomeJogador) {
		return mapaJogadores.get(nomeJogador);
	}

	
	private String determinaCor(int numeroJogador) {
		return (numeroJogador % 2 == 0 ? "Branca" : "Preta");
	}

	public String getCorJogador(String nomeJogador) {
		return getJogadorByName(nomeJogador).getCorJogador();
	}

	public String getCorOpostaJogador(String nomeJogador) {
		return TabuleiroUtils.getCorOposta(getJogadorByName(nomeJogador).getCorJogador());
	}

	public String getNomeJogadorPorTipo(String jogadorPrincipal,
			int indiceJogador) {
		return posicionamentoMesas.get(jogadorPrincipal).getNomeJogador(
				indiceJogador);
	}

	public Jogador getJogadorPorTipo(String jogadorPrincipal, int indiceJogador) {
		return getJogadorByName(posicionamentoMesas.get(jogadorPrincipal)
				.getNomeJogador(indiceJogador));
	}
	
	public void setTurnoJogador (String nomeJogador,boolean turno) {
		getJogadorByName(nomeJogador).setTurno(turno);
	}

	public int getIndiceJogadorByName (String nomeJogadorPrincipal,String nomeJogadorJogada) {
		PosicionamentoMesa posicao = posicionamentoMesas.get(nomeJogadorPrincipal);
		return posicao.getIndiceJogador(nomeJogadorJogada);
	
	}
	
	
	private class PosicionamentoMesa {

		private final String[] mapaPosicoes = new String[4];

		public PosicionamentoMesa(String[] arrayJogadores, String nomeJogador) {
			for (int i = 0; i < 4; i++)
				if (nomeJogador.equals(arrayJogadores[i]))
					setIndiceOutrosJogadores(i, arrayJogadores);

		}

		private void setIndiceOutrosJogadores(int jogadorPrincipal,
				String[] arrayJogadores) {
			int ADVERSARIO = (jogadorPrincipal % 2 == 0 ? jogadorPrincipal + 1
					: jogadorPrincipal - 1);
			int DUPLA = 3 - jogadorPrincipal;
			int DUPLAADVERSARIA = (jogadorPrincipal >= 2 ? jogadorPrincipal - 2
					: 2 + jogadorPrincipal);
			mapaPosicoes[0] = arrayJogadores[jogadorPrincipal];
			mapaPosicoes[1] = arrayJogadores[ADVERSARIO];
			mapaPosicoes[2] = arrayJogadores[DUPLAADVERSARIA];
			mapaPosicoes[3] = arrayJogadores[DUPLA];

		}

		public String getNomeJogador(int tipoJogador) {
			return mapaPosicoes[tipoJogador];
		}
		
		public int getIndiceJogador (String nomeJogador) {
			for (int i=0; i <4; i++) {
				if (nomeJogador.equals(mapaPosicoes[i]))
					return i;
			}
		return -1;
		}

	}

	public void ajustarTurnosIniciais() {
		for (String nomeJogador : getMapaJogadores().keySet() ) {
			if (getCorJogador(nomeJogador).equals("Branca"))
				setTurnoJogador(nomeJogador, true);
			
			
		}
		
	}

}
